from PIL import Image, ImageDraw, ImageFont
import os
import re
import pandas as pd


class photo:

    def batch_mark_photos(self,dir):
        for fn in os.listdir(dir):
            print(f'正在处理 {fn} ...',end='')
            marked_text=self.extract_text(fn)
            output_path=f"{os.path.join(dir,fn).split('.')[0]}-marked.jpg"
            # print(os.path.join(dir,fn))
            self.add_watermark(os.path.join(dir,fn),marked_text,output_path,size=(750,1000))
            print('完成\n')

    def extract_text(self,fn):
        mark_text='-'.join(fn.split('.')[0].split('-')[:3])
        return mark_text

    def add_watermark(self,image_path, text, output_path,size=(300,400)):
        # 打开图片
        image = Image.open(image_path)

        # 计算缩放后的尺寸（保持宽高比）
        width, height = image.size
        target_width, target_height = size[0], size[1]

        # 判断是否需要旋转图片
        if width > height:
            target_width, target_height = size[0], size[1]

        # 缩放图片
        image = image.resize((target_width, target_height), Image.ANTIALIAS)

        # 创建绘图对象
        draw = ImageDraw.Draw(image)

        # 设置字体（使用系统默认字体，或指定字体文件路径）
        try:
            font = ImageFont.truetype("arial.ttf", 28)  # 使用系统字体
        except IOError:
            font = ImageFont.load_default()  # 使用默认字体

        # 计算文字位置（居中，距离底部10px）
        text_width, text_height = draw.textsize(text, font=font)
        text_position = ((target_width - text_width) // 2, target_height - text_height - 10)

        # 添加文字
        draw.text(text_position, text, font=font, fill="white")

        # 保存图片
        # image.show()
        image.save(output_path)

        # print(f"图片已保存到: {output_path}"

class images:
    def __init__(self):
        pass

    def read_text(self,xlsx=r'e:\temp\ejj\饰品.xlsx',sheet_name='五行饰品'):
        df=pd.read_excel(xlsx,sheet_name=sheet_name)
        # print(df)
        return df


    def process_images(self,input_folder,filename,output_folder,qr_code_path=r'D:\工作目录\ejj\素材\其他\ejj_ktt_qrcode.jpg',dec_info_xlsx=r'e:\temp\ejj\饰品.xlsx'):
        os.makedirs(output_folder, exist_ok=True)
        qr_img = Image.open(qr_code_path).convert("RGBA")
        font = ImageFont.truetype("simhei.ttf", 17)  # 需要中文字体文件
        #根据编码匹配sheet_name
        sheet_name='五行饰品'
        if filename.lower().startswith('sh'):
            sheet_name='五行饰品'
        if filename.lower().startswith('ot'):
            sheet_name='其他文创'

        df=self.read_text(xlsx=dec_info_xlsx,sheet_name=sheet_name)
        digits=9
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            # print(filename,df[df['商品编码'] == filename[:digits]]['材料'])
            # 非标准9位数的商品编码，需要识别商品编码位数
            if filename.split('.')[0].count('-')==3 and filename.split('.')[0].split('-')[-1].lower().startswith('d'):
                digits=int(filename.split('.')[0].split('-')[-1][1:])

            

            if df[df['商品编码'] == filename[:digits]]['材料'].empty or df[df['商品编码'] == filename[:digits]]['材料'].isna().any() or df[df['商品编码'] == filename[:digits]]['材料'].eq('').any():

                return filename
            
            print(f'正在处理 {filename}... ',end='')
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)         
            
            # 打开原始图片
            with Image.open(input_path) as img:
                # 调整图片大小，短边为720px
                width, height = img.size
                if width > height:
                    new_height = 720
                    new_width = int(width * (new_height / height))
                else:
                    new_width = 720
                    new_height = int(height * (new_width / width))
                img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                width, height = img.size
                
                # 创建半透明条带
                band_height = 100  # 条带高度
                band = Image.new('RGBA', (width, band_height), (128, 128, 128, 128))
                
                # 调整二维码尺寸（高度为条带的80%）
                qr_height = int(band_height * 0.8)
                qr_resized = qr_img.resize((qr_height, qr_height), Image.Resampling.LANCZOS)
                
                # 在原图上直接添加元素
                final_img = img.convert('RGBA')
                
                # 添加半透明矩形（覆盖在图片底部）
                band_mask = band.split()[3]  # 获取alpha通道
                final_img.paste(band, (0, height - band_height), band_mask)  # 使用alpha通道进行合成
                
                # 添加二维码（左侧）
                # 添加二维码（左侧）
                qr_position = (20, height - band_height + int(band_height*0.1))
                final_img.paste(qr_resized, qr_position, qr_resized)
                
                # 添加文字（右侧）
                
                # print('filename:',filename,'\ninfo:',df[df['商品编码']==filename[:digits]]['五行属性'].apply(lambda x: str(x) if pd.notnull(x) else ''))

                # 准备文字内容
                if sheet_name=='五行饰品':
                    text_content = '\n'.join([
                        f"【 {df[df['商品编码'] == filename[:digits]]['五行属性'].astype(str).str.cat(sep=' ')} 】",
                        df[df['商品编码'] == filename[:digits]]['材料'].astype(str).str.cat(sep=' ')
                    ])
                elif sheet_name=='其他文创':
                    text_content = '\n'.join([
                        f"◆ {df[df['商品编码'] == filename[:digits]]['商品名称'].values[0]} ◆",
                        df[df['商品编码'] == filename[:digits]]['文案描述'].values[0]
                    ])
                
                # 计算文字区域
                draw = ImageDraw.Draw(final_img)
                text_area_width = width - (qr_position[0] + qr_height + 60)  # 总宽度减去二维码和边距
                text_x = qr_position[0] + qr_height + 40
                text_y = height - band_height + 8  # 文字区域顶部位置
                
                # 自动换行处理
                from textwrap import wrap
                lines = []
                for paragraph in text_content.split('\n'):
                    lines.extend(wrap(paragraph, width=28))  # 每行最多30个字符
                
                # 绘制文字
                draw.text((text_x, text_y), filename[:digits], font=ImageFont.truetype("simhei.ttf", 14), fill=(255, 255, 255, 200))
                line_height = font.getbbox('hg')[3] - font.getbbox('hg')[1]  # 获取行高
                line_spacing = 7 # 行间距
                for line in lines:
                    if text_y + line_height > height - 10:  # 防止超出文字区域
                        break
                    draw.text((text_x, text_y+line_spacing+line_height+2), line, font=font, fill=(255, 255, 255, 200))
                    text_y += line_height + line_spacing  # 行间距
                
                # 保存结果
                # 转换为RGB模式并保存为JPG
                print(f'正在保存...{output_path}',end='')
                final_img = final_img.convert('RGB')
                # output_path = os.path.splitext(output_path)[0] + '.jpg'          
                final_img.save(output_path, quality=95)  # 保存为JPG格式
                print(f'完成')
        return 'ok'

    def batch_process_images(self,input_folder, output_folder, qr_code_path,dec_info_xlsx=r'E:\temp\ejj\文创\饰品'):

        # 遍历输入文件夹
        empty_material_list=[]
        for filename in os.listdir(input_folder):
            # print(f'正在处理{filename}...')
            res=self.process_images(input_folder=input_folder,filename=filename,
                                output_folder=output_folder,
                                qr_code_path=qr_code_path,
                                dec_info_xlsx=dec_info_xlsx)
            if res!='ok':
                empty_material_list.append(res)
        if empty_material_list:
            print(f"以下图片在饰品表中无对应的材料：{','.join(empty_material_list)}")
        os.startfile(output_folder)

        input('按回车键退出。。。')
    

if __name__=='__main__':
    # 示例调用
    # image_path = r"E:\temp\ejj\文创\饰品\打标照片\SH-SL-001.jpg"  # 输入图片路径
    # text = "Sample Watermark"  # 要添加的文字
    # output_path = r"E:\temp\ejj\文创\饰品\打标照片\SH-SL-001-marked.jpg"  # 输出图片路径

    # p=photo()
    # # p.read_photo(dir=r"E:\temp\ejj\文创\饰品\打标照片")
    # p.batch_mark_photos(dir=r"E:\temp\ejj\文创\饰品\打标照片")

    # 图片写入qrcode及材料
    p=images()
    # p.read_text(xlsx=r'e:\temp\ejj\饰品.xlsx',sheet_name='五行饰品')
    # p.process_images(input_folder=r'e:\temp\ejj\文创\饰品',filename='SH-SL-004.jpg',output_folder=r'e:\temp\ejj\文创\饰品\add_qrcode_text_imgs',
    #                  qr_code_path=r'D:\工作目录\ejj\素材\其他\ejj_ktt_qrcode.jpg')
    p.batch_process_images(input_folder=r'e:\temp\ejj\文创\饰品\待打标', output_folder=r'e:\temp\ejj\文创\饰品\二维码图片', 
                           qr_code_path=r'D:\工作目录\ejj\素材\其他\ejj_ktt_qrcode.jpg',
                           dec_info_xlsx=r'E:\temp\ejj\文创\饰品\饰品.xlsx')
